Corrigindo a localização de um modelo com ifcOpenShell

É possível que você já tenha passado por este problema! modelos no formato ifc vindo de todas as direções, de várias fontes, de vários softwares diferentes e de repente, aparece um que não encaixa onde deveria!

Algumas aplicações não dão a devida atenção à geolocalização do modelo, ou não possibilitam uma configuração de exportação adequada, e quando você tenta criar o tão famoso ‘federado’, eis que surge a primeira frustação ao se trabalhar com ifc: os modelos não casam!

Pronto, eu sabia! bem que me disseram que este negócio de ifc não funcionava! Não, não ponha a culpa no pobre do ifc. Em primeiro lugar, ifc é um padrão. E o padrão contém todas as informações necessárias para uma perfeita geolocalização do modelo. Acontece que a qualidade das exportações que algumas aplicações oferecem é muito baixa ou oferece poucas possibilidades de configuração.

Por conta disso, o conhecimento de programação se torna necessário e, em algumas vezes, o único recurso disponível!

O que fazer?

Talvez não seja o ideal, mas é possível mover um modelo no padrão ifc sem muito esforço, através de programação, utilizando o pacote para Python chamado IfcOpenShell. Primeiro, é preciso compreender como os objetos são geograficamente locados no padrão ifc.

Os objetos no ifc possuem um coordenada de referência, uma origem, sempre relativa a outra coordenada de origem. São objetos da classe IfcLocalPlacement. Estes objetos indicam a localização de um objeto através do atributo ObjectPlacement. Geralmente os objetos estão locados em relação ao pavimento (IfcBuildingStorey), que está locado em relação à uma construção (IfcBuilding), que por sua vez está locado a um local (IfcSite). O atributo ObjectPlacement do IfcSite aponta para a origem do modelo. Como todas as coordenadas são relativas à coordenada do IfcSite (geralmente, pois podem haver variações), Ao modificar esta coordenada você move todo o modelo. É exatamente isso que vamos fazer aqui.

Mas para mover de forma correta e precisa, é necessário alguma referência. Uma boa prática é ter um objeto em cada modelo que você sabe que deveriam estar no mesmo lugar, ou seja, possuem suas origens coincidentes. No caso do nosso exemplo criei um objeto que será exportado na classe IfcBuildingElementProxy e terá o nome de marco:

Este objeto será a minha referência. A diferença entre as coordenadas destes objetos, nos dois arquivos, será exatamente o quanto vou movimentar o arquivo que desejo mover.

Movendo o modelo

Aqui vou utilizar o jupyter notebook como ambiente de programação. Primeiro é preciso ler os dois arquivos carregar seus respectivos objetos da classe IfcSite:

Depois obtemos os objetos de referência, um de cada modelo:

Precisamos calcular a diferença entre as coordenadas destes dois objetos para calcular a coordenada da nova origem do modelo, somando a coordenada de origem às diferenças em x, y e z:

No padrão ifc, os diferentes elementos construtivos, sejam eles portas, janelas ou pavimentos e construções, se localizam através de objetos da classe IfcLocalPlacement, que apontam para outros objetos da classe IfcAxis2Placements3D. Estes contém não só as coordenadas relativas ao próximo objeto IfcLocalPlacement de outro elemento, como também o vetor que define a direção do eixo x (RefDirection) e do eixo z (Axis):

Para mover o nosso IfcSite para a nova coordenada calculada bastaria trocar o atributo Coordinates do objeto IfcAxis2Placement que define a localização do IfcSite, mas isso pode ser bem desastroso. Acontece que alguns arquivos podem estar otimizados para terem seus tamanhos diminuidos, e parte desta otimização é aproveitar os objetos de localização de um elemento para vários outros elementos se a coordenada for igual, por exemplo. Como todas as localizações são relativas, imagine que várias representações geométricas podem ter a coordenada (0,0,0) como referência. Se a coordenada do objeto de localização do IfcSite foi utilizada nesta otimização, é possível que ao alterar esta coordenada, ou este objeto de localização, vários elementos percam a referência. É por causa disso que ao alterarmos diretamente o objeto de localização do IfcSite no arquivo através de um editor de texto, ao abrirmos o arquivo num visualizador, percebemos que várias geometrias perdem a referência, e os elementos parecem estar explodidos.

Por conta disso, vamos criar um objeto de localização novo, sem mexer no existente, e portanto, sem mexer nas suas referência. A única coisa que precisamos fazer é apontar para este novo objeto:

Agora é hora de mover o modelo, apontando o objeto IfcLocalPlacement para a sua nova localização. Depois gravamos um novo arquivo ifc:

Partindo para o abraço…

Ao abrir o modelo federado temos a grande surpresa: deu certo!

Você pode baixar o notebook comentado e os arquivos exemplo no link abaixo:

https://github.com/c4rlosdias/BIM-Notebooks/tree/main/Ifc_MoveModels